package com.example.demopoi.generateExcel.util.util2;


import com.example.demopoi.generateExcel.entity.OutExcelQuery;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddressList;

import java.lang.reflect.Field;
import java.util.List;

/**
 *  数据导出excel，工具类    可以设置某些列的下拉菜单 选项为 是或者否
 * @author ldj
 * @date 209-08-05
 * */
public class ExcelUtil {

    /**
     *  生成Excel表格
     * @param sheetName sheet名称
     * @param titleList 表头列表
     * @param dataList 数据列表
     * @param outExcelQuery 下拉选项设置
     * @return HSSFWorkbook对象
     * */
    public static HSSFWorkbook createExcel(String sheetName, List<String> titleList,
                                           List dataList, OutExcelQuery outExcelQuery) throws IllegalAccessException {

        //创建HSSFWorkbook对象(excel的文档对象)
        HSSFWorkbook wb = new HSSFWorkbook();
        //创建sheet对象（excel的表单）
        HSSFSheet sheet=wb.createSheet(sheetName);
        //在sheet里创建第一行，这里即是表头
        HSSFRow rowTitle=sheet.createRow(0);

        //写入表头的每一个列
        for (int i = 0; i < titleList.size(); i++) {
            //创建单元格
            rowTitle.createCell(i).setCellValue(titleList.get(i));
        }

        //写入每一行的记录
        int count = 0;
        for (int i = 0; i < dataList.size(); i++) {
            count++;
            //创建新的一行，递增
            HSSFRow rowData = sheet.createRow(i+1);

            //通过反射，获取POJO对象
            Class cl = dataList.get(i).getClass();
            //获取类的所有字段
            Field[] fields = cl.getDeclaredFields();
            for (int j = 0; j < fields.length; j++) {
                //设置字段可见，否则会报错，禁止访问
                fields[j].setAccessible(true);
                //创建单元格
                rowData.createCell(j).setCellValue((String) fields[j].get(dataList.get(i)));
            }
        }

        //如果开启了下拉选项
        if (outExcelQuery!=null){
            //如果表格中的记录数不是0
            if (count!=0){
                // 获取下拉列表数据
                String[] strs = outExcelQuery.getParams();
                //设置哪些行的哪些列为下拉选项
                CellRangeAddressList rangeList =
                        new CellRangeAddressList(outExcelQuery.getRowStart(),
                                //结束行为-1时，说明设置所有行
                                outExcelQuery.getRowEnd()==-1?count:outExcelQuery.getRowEnd(),
                                outExcelQuery.getColStart(),outExcelQuery.getColEnd());
                //绑定下拉数据
                DVConstraint constraint = DVConstraint.createExplicitListConstraint(strs);
                //绑定两者的关系
                HSSFDataValidation dataValidation = new HSSFDataValidation(rangeList,constraint);
                //添加到sheet中
                sheet.addValidationData(dataValidation);
            }
        }
        return wb;
    }
}
